package com.javaee.ch12.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.javaee.ch12.common.exceptions.ServiceException;
import com.javaee.ch12.entity.Book;
import com.javaee.ch12.mapper.BookMapper;
import com.javaee.ch12.service.BookService;
import com.javaee.ch12.web.dto.BookDto;
import com.javaee.ch12.web.dto.queryDto.BookQueryDto;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional
public class BookServiceImpl extends ServiceImpl<BookMapper, Book> implements BookService {

    @Override
    public void addBook(BookDto addDto) {
        Book book = new Book();
        BeanUtils.copyProperties(addDto, book);
        book.setBookId(addDto.getBookId());
        book.setAuthor(addDto.getAuthor());
        if (!this.save(book)) {
            throw new ServiceException("系统错误,添加操作失败!");
        }
    }

    @Override
    public void updateBook(BookDto updateDto) {
        Book book = new Book();
        BeanUtils.copyProperties(updateDto, book);
        if (!super.updateById(book)) {
            throw new ServiceException("系统错误,更新操作失败!");
        }
    }



    @Override
    public List<Book> query(BookQueryDto queryDto) {
        List<Book> result = this.lambdaQuery()
                // 标题模糊查询（非空时生效）
                .like(StringUtils.isNotBlank(queryDto.getTitle()), Book::getTitle, queryDto.getTitle())
                // 作者模糊查询（非空时生效）
                .like(StringUtils.isNotBlank(queryDto.getAuthor()), Book::getAuthor, queryDto.getAuthor())
                // ISBN精确查询（非空时生效）
                .eq(StringUtils.isNotBlank(queryDto.getIsbn()), Book::getIsbn, queryDto.getIsbn())
                // 出版社模糊查询（非空时生效）
                .like(StringUtils.isNotBlank(queryDto.getPublisher()), Book::getPublisher, queryDto.getPublisher())
                // 出版年份范围查询（非空时生效）
                .ge(queryDto.getYearFrom() != null, Book::getPublicationYear, queryDto.getYearFrom())
                .le(queryDto.getYearTo() != null, Book::getPublicationYear, queryDto.getYearTo())
                // 分类ID精确查询（非空时生效）
                .eq(queryDto.getCategoryId() != null, Book::getCategoryId, queryDto.getCategoryId())
                // 状态精确查询（非空时生效）
                .eq(queryDto.getStatus() != null, Book::getStatus, queryDto.getStatus())
                .list();

        // 返回查询结果
        return result;
    }
}